package com.ruoyi.common.utils.poi;

import cn.hutool.core.lang.Tuple;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.IdUtil;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.xwpf.usermodel.*;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBookmark;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTP;

import java.io.*;
import java.math.BigInteger;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.TreeMap;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class TestWord {


    public static void main(String[] args) throws Exception {
        String sourceWordPath = "E:\\testWord\\testword20240718_current.docx";
        String pathDiagram1 = "E:\\testWord\\diagram1.png";
        String pathDiagram2 = "E:\\testWord\\diagram2.png";


        String outputPath = "E:\\testWord\\testword20240718_current_"+ IdUtil.fastSimpleUUID() +".docx";

        //第一段落 ${high} 替换成 888KM
        //第二段落 ${diagram1} 替换成 图片
        //PoiWordUtil.templateWrite(sourceWordPath, outputPath, paramMap);

        Map<String, String> picMap = MapUtil.builder(new TreeMap<String,String>())
                .put("图 1 大气标高数据和模拟值时序分布图", pathDiagram1)
                .put("图 2 大气标高数据和模拟值时序分布图", pathDiagram2)
                .build();

        Map<String, Object> params = MapUtil.builder(new HashMap<String, Object>())
                .put("chapter_2", picMap)
                .put("chapter_3", picMap)
                .build();


        InputStream is = new FileInputStream(sourceWordPath);
        XWPFDocument doc = new XWPFDocument(is);
        for(XWPFParagraph paragraph : doc.getParagraphs()) {

            CTP ctp = paragraph.getCTP();
            for (int dwI = 0; dwI < ctp.sizeOfBookmarkStartArray(); dwI++) {
                try {
                    CTBookmark bookmark = ctp.getBookmarkStartArray(dwI);
                    if(!params.containsKey(bookmark.getName())) continue;

                    Map<String, String> multiPicMap = (Map<String, String>)params.get(bookmark.getName());
                    multiPicMap.entrySet().forEach(entry -> {
                        String name = entry.getKey();
                        String picPath = entry.getValue();
                        InputStream picIs = null;
                        try {
                            picIs = new FileInputStream(picPath);
                            if(picIs == null) return;
                            XWPFRun picRun = paragraph.createRun();
                            //bus.png为鼠标在word里选择图片时，图片显示的名字，400，400则为像素单元，根据实际需要的大小进行调整即可。
                            int[] picWidthAndHeight = PoiWordUtil.getPictureWidthAndHeght(picPath);
                            picRun.addPicture(picIs, XWPFDocument.PICTURE_TYPE_PNG,"bus.png,", picWidthAndHeight[0], picWidthAndHeight[1]);
                            picRun.addBreak(BreakType.TEXT_WRAPPING);

                            //添加题注,题注要先创建题注再关联到图片，非常麻烦，这里直接使用文本
                            XWPFRun txtRun = paragraph.createRun();
                            txtRun.setBold(true);
                            txtRun.setFontSize(8);
                            txtRun.setText(name);
                            txtRun.addBreak(BreakType.TEXT_WRAPPING);

                            paragraph.setAlignment(ParagraphAlignment.CENTER);

                        } catch (Exception e) {
                            throw new RuntimeException(e);
                        }
                    });

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
        }




        OutputStream os = new FileOutputStream(outputPath);


        doc.write(os);

        PoiWordUtil.close(is);
        PoiWordUtil.close(os);
        System.out.println("已结束！！！");

    }



//    public static void main(String[] args) throws Exception {
//
//        String outputPath = "E:\\testWord\\测试合并_current_"+ IdUtil.fastSimpleUUID() +".docx";
//
//        // 创建一个新的Word文档
//        XWPFDocument document = new XWPFDocument();
//
//        // 创建一个表格
//        XWPFTable table = document.createTable(2, 2); // 2行2列的表格
//
//        // 插入数据并合并单元格
//        // 在第一行第一列插入数据，并合并两行
//        table.getRow(0).getCell(0).setText("合并两行");
//        mergeCellsHorizontally(table, 0, 0, 1); // 合并第一行的两个单元格
//
//        // 在第二行第一列插入数据
//        table.getRow(1).getCell(0).setText("第二行，第一列");
//
//        // 在第一行第二列插入数据
//        table.getRow(0).getCell(1).setText("第一行，第二列");
//
//        String text = table.getRow(0).getCell(1).getText();
//        System.out.println(text);
//        // 在第二行第二列插入数据，并合并两列
//        table.getRow(1).getCell(1).setText("合并两列");
//        mergeCellsVertically(table, 1, 1, 1); // 合并第二列的两个单元格
//
//        // 写入到文件
//        FileOutputStream out = new FileOutputStream(outputPath);
//        document.write(out);
//        out.close();
//
//        // 关闭文档
//        document.close();
//
//    }
//
//    // 水平合并单元格的辅助函数
//    private static void mergeCellsHorizontally(XWPFTable table, int row, int fromCell, int toCell) {
//        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
//            table.getRow(row).getCell(cellIndex).getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
//        }
//        table.getRow(row).getCell(fromCell).getCTTc().getTcPr().getHMerge().setVal(STMerge.CONTINUE);
//    }
//
//    // 垂直合并单元格的辅助函数
//    private static void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
//        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
//            table.getRow(rowIndex).getCell(col).getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
//        }
//        table.getRow(fromRow).getCell(col).getCTTc().getTcPr().getVMerge().setVal(STMerge.CONTINUE);
//    }
//



}
